package back;

import java.awt.Color;

/**
 * Clase Caja que implementa la interfaz Movible y Elemento
 * permite definir el comportamiento de una caja
 */

public class Caja implements Movible{

	private Color color;

	/**
	 * Constructor de la clase Caja
	 * @param Color color de la caja 
	 */
	public Caja(Color color){
		this.color = color;
	}
	
	/**
	 * Retorna el color de la caja
	 * @return Color color de la caja. 
	 */
	public Color getColor(){
		return color;
	}
	
	/**
	 * Mueve la caja desde celdaOrigen a celdaDestino
	 * y setea las variables Movible mov de ambas celdas.
	 * @param Celda celdaOrigen celda desde donde se va a mover la caja.
	 * @param Celda celdaDestino celda hacia donde se va a mover la caja. 
	 */
	public void mueve(Celda celdaOrigen, Celda celdaDestino) {
		celdaOrigen.setMovible(new VacioM());
		if(!(celdaDestino.getNoMovible().getClass() == Agujero.class)){
			celdaDestino.setMovible(new Caja(color));
		}
						
	}

	/**
	 * Retorna true en caso de que se pueda mover la caja a destino
	 * con la direccion pasada como parametro, false en caso contrario
	 * @param int direccion desde donde se quiere realizar el movimiento
	 * @param Celda destino
	 * @return boolean
	 */
	public boolean posibleMov(int direccion, Celda destino) {
		return (destino.getNoMovible().posibleMov(direccion, destino) &&
				destino.getMovible().getClass()==VacioM.class);
	}

	/**
	 * Mueve la caja desde celdaOrigen
	 * con la direccion pasada como parametro
	 * @param Celda celdaOrigen
	 * @param int direccion del movimiento
	 */
	
	public void mueve(Celda celdaOrigen, int direccion) {
		Celda celdaDestino=celdaOrigen.getCeldaHacia(direccion);
		celdaDestino.getMovible().mueve(celdaDestino, direccion);
		celdaDestino.pongoMovible(this);
		celdaOrigen.pongoMovible(new VacioM());
		
	}

	/**
	 * Elimina la caja de la celda pasada como parametro
	 * @param Celda celda
	 */
	public void eliminar(Celda celda) {
		celda.setMovible(new VacioM());
		celda.getTablero().eliminaCaja();
		
	}

	/**
	 * Agrega una caja en la celda pasada como parametro
	 * @param Celda celda
	 */
	public void agrego(Celda celda) {
		celda.setMovible(this);
		celda.getTablero().agregaCaja();
		celda.getNoMovible().interaccion(celda);
		
	}


}

